package com.jz.algorithm.Hash;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;

/**
 * @Classname MyHash
 * @Description 关于hash一些题目
 * @Date 2021/11/11 9:23
 * @Author Jz
 * @Version
 */
public class MyHash {


    /**
     * @Methodname fourSumCount
     * @Description 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ，使得 A[i] + B[j] + C[k] + D[l] = 0。
     * @Date 2021/11/11 9:26
     * @Author Jz
     * @Return
     * @Param
     */
    public  static int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {

        int count = 0;
        HashMap<Integer, Integer> integerHashMapHashMap = new HashMap<>();

        ArrayList<Integer> objects = new ArrayList<>();
        for (int i = 0; i < nums1.length; i++) {
            for (int i1 = 0; i1 < nums2.length; i1++) {
                int sum=nums1[i]+nums2[i1];
               if (integerHashMapHashMap.containsKey(0-sum)){
                   integerHashMapHashMap.put(0-sum,integerHashMapHashMap.get(0-sum)+1);
               }
               else {
                   integerHashMapHashMap.put(0-sum,1);
               }

            }
        }


        for (int i = 0; i < nums3.length; i++) {
            for (int i1 = 0; i1 < nums4.length; i1++) {


                    if (integerHashMapHashMap.containsKey(nums3[i]+nums4[i1])) {
                      count+= integerHashMapHashMap.get(nums3[i]+nums4[i1]);

                    }
                }

            }

        return count;


    }

    /**
     * @Methodname canConstruct
     * @Description 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串，判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成，返回 true ；否则返回 false。
     *
     * (题目说明：为了不暴露赎金信字迹，要从杂志上搜索各个需要的字母，组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)
     *
     * @Date 2021/11/12 9:59
     * @Author Jz
     * @Return 
     * @Param 
     */
    public static boolean canConstruct(String ransomNote, String magazine) {
        HashMap<Character, Integer> characterIntegerHashMap = new HashMap<>();

        for (int i = 0; i < magazine.length(); i++) {

            if (characterIntegerHashMap.containsKey(magazine.charAt(i))) {
                characterIntegerHashMap.put(magazine.charAt(i),characterIntegerHashMap.get(magazine.charAt(i))+1);
            }
            else {
                characterIntegerHashMap.put(magazine.charAt(i),1);
            }
        }
        for (int i = 0; i < ransomNote.length(); i++) {
            if (characterIntegerHashMap.containsKey(ransomNote.charAt(i))){
                characterIntegerHashMap.put(ransomNote.charAt(i),characterIntegerHashMap.get(ransomNote.charAt(i))-1);
            }
            else {
                return false;
            }

        }

        Set<Map.Entry<Character, Integer>> entries = characterIntegerHashMap.entrySet();
        for (Map.Entry<Character, Integer> entry : entries) {
            if (entry.getValue()<0){
                return false;
            }
        }
        return  true;


    }

    public static void main(String[] args) {
        String a="aa";
        String b="aab";

        boolean b1 = canConstruct(a, b);
        System.out.println(b1);
    }


}
